#ifndef SKFUNCTIONSET_H
#define SKFUNCTIONSET_H

#include <QDialog>
#include <QButtonGroup>
#include <QTimer>
#include <QtConcurrent>

// 前向声明
class ScanCameraDevice;

namespace Ui {
class SKFunctionSet;
}

/**
 * @brief SK功能设置窗口类
 * 
 * 该类提供了扫描相机SK功能的参数设置界面，包括快门控制、增益设置、工作模式等参数的配置
 * 通过UI控件直接与Device交互，实现参数的实时更新和设备控制
 */
class SKFunctionSet : public QDialog
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param device 设备对象指针
     * @param parent 父窗口指针
     */
    explicit SKFunctionSet(ScanCameraDevice * device,QWidget *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~SKFunctionSet();
    
    /**
     * @brief 获取当前设备指针
     * @return Device* 设备指针
     */
    ScanCameraDevice* getDevice() const;
        
    /**
     * @brief 从设备获取参数并更新UI
     * @details 从设备读取所有参数并调用相应的设置接口更新UI显示
     */
    void fetchParametersFromDevice();
    
    /**
     * @brief 设置快门控制状态
     * @param enable true-启用，false-禁用
     */
    void setShutterControl(bool enable);
    
    /**
     * @brief 获取快门控制状态
     * @return bool 快门控制状态
     */
    bool getShutterControl();
    
    /**
     * @brief 设置工作模式
     * @param mode 工作模式值
     */
    void setWorkMode(int mode);
    
    /**
     * @brief 获取工作模式
     * @return int 工作模式值
     */
    int getWorkMode();
    
    /**
     * @brief 设置增益1值
     * @param gain 增益1的值
     */
    void setGain1(int gain);
    
    /**
     * @brief 获取增益1值
     * @return int 增益1的值
     */
    int getGain1();
    
    /**
     * @brief 设置增益2值
     * @param gain 增益2的值
     */
    void setGain2(int gain);
    
    /**
     * @brief 获取增益2值
     * @return int 增益2的值
     */
    int getGain2();
    
    /**
     * @brief 设置扫描速度模式
     * @param mode 扫描速度模式
     */
    void setComponentSelection(int mode);
    
    /**
     * @brief 获取扫描速度模式
     * @return int 扫描速度模式
     */
    int getComponentSelection();
    
    /**
     * @brief 设置触发源
     * @param source 触发源
     */
    void setTriggerSource(int source);
    
    /**
     * @brief 获取触发源
     * @return int 触发源
     */
    int getTriggerSource();
    
    /**
     * @brief 获取监控使能状态
     * @return bool 监控使能状态
     */
    bool getMonitorEnabled() const;
    
    /**
     * @brief 设置监控使能状态
     * @param enabled true-启用，false-禁用
     */
    void setMonitorEnabled(bool enabled);
    
    /**
     * @brief 获取阴极门控模式
     * @return uint8_t 阴极门控模式
     */
    uint8_t getCathodeGatingMode() const;
    
    /**
     * @brief 设置阴极门控模式
     * @param mode 阴极门控模式
     */
    void setCathodeGatingMode(uint8_t mode);
    
    /**
     * @brief 获取阴极门控触发延迟
     * @return int 触发延迟值
     */
    int getCathodeGatingTriggerDelay() const;
    
    /**
     * @brief 设置阴极门控触发延迟
     * @param delay 触发延迟值
     */
    void setCathodeGatingTriggerDelay(int delay);
    
    /**
     * @brief 获取阴极门控脉冲宽度
     * @return int 脉冲宽度值
     */
    int getCathodeGatingPulseWidth() const;
    
    /**
     * @brief 设置阴极门控脉冲宽度
     * @param width 脉冲宽度值
     */
    void setCathodeGatingPulseWidth(int width);
    
    /**
     * @brief 获取MCP门控模式
     * @return bool MCP门控模式状态
     */
    bool getMCPGateMode() const;
    
    /**
     * @brief 设置MCP门控模式
     * @param mode 门控模式
     */
    void setMCPGateMode(uint8_t mode);
    
    /**
     * @brief 获取MCP门控触发延迟
     * @return int 触发延迟值
     */
    int getMCPDelay() const;

    /**
     * @brief 设置MCP门控触发延迟
     * @param delay 触发延迟值
     */
    void setMCPDelay(int delay);

    /**
     * @brief 获取MCP门控脉冲宽度
     * @return int 脉冲宽度值
     */
    int getMCPPulseWidth() const;

    /**
     * @brief 设置MCP门控脉冲宽度
     * @param width 脉冲宽度值
     */
    void setMCPPulseWidth(int width);

    /**
     * @brief 获取内触发延时
     * @return int 内触发延时值
     */
    int getTriggerDelay();

    /**
     * @brief 设置内触发演示
     * @param delay 触发延迟值
     */
    void setTriggerDelay(int delay);

    /**
     * @brief 获取内触发脉冲宽度
     * @return int 脉冲宽度值
     */
    int getTriggerPulseWidth();

    /**
     * @brief 设置内触发脉冲宽度
     * @param width 脉冲宽度值
     */
    void setTriggerPulseWidth(int width);

    /**
     * @brief updateConfig 当配置更新后更新UI状态
     */
    void updateConfig(QVariantMap);

private slots:

    /**
     * @brief 关闭按钮点击槽函数
     */
    void onCloseButtonClicked();

    /**
     * @brief 快门控制开关状态变更槽函数
     * @param checked 开关状态，true为开启，false为关闭
     */
    void onShutterControlChanged(bool checked);
    
    /**
     * @brief 工作模式变更槽函数
     */
    void onWorkModeChanged(QAbstractButton* button, bool checked);
    
    /**
     * @brief 增益设置按钮点击槽函数
     */
    void onGainSetClicked();
    
    /**
     * @brief 增益取消按钮点击槽函数
     */
    void onGainCancelClicked();
    
    /**
     * @brief 扫描速度模式变更槽函数
     * @param button 当前变更的按钮
     * @param checked 按钮选中状态
     */
    void onComponentSelectionChanged(QAbstractButton* button, bool checked);
    
    /**
     * @brief 触发源变更槽函数
     * @param button 当前变更的按钮
     * @param checked 按钮选中状态
     */
    void onTriggerSourceChanged(QAbstractButton* button, bool checked);
    
    /**
     * @brief 触发延时变更槽函数
     */
    void onTriggerDelayChanged();
    
    /**
     * @brief 触发延迟设置按钮点击槽函数
     */
    void onTriggerDelaySetClicked();
    
    /**
     * @brief 触发延迟取消按钮点击槽函数
     */
    void onTriggerDelayCancelClicked();

    /**
     * @brief onCathodeGatingToggled mcp门控按钮事件
     * @param checked
     */
    void onCathodeGatingModeToggled(bool checked);
    /**
     * @brief onExternalGatingToggled 外触发
     * @param checked
     */
    void onExternalGatingModeToggled(bool checked);

    /**
     * @brief onCathodeGatingToggled 阴极门控按钮事件
     * @param checked
     */
    void onCathodeGatingToggled(bool checked);
    /**
     * @brief onExternalGatingToggled 外触发
     * @param checked
     */
    void onExternalGatingToggled(bool checked);
    
    /**
     * @brief 阴极门控设置按钮点击槽函数
     */
    void onCathodeGateSetClicked();
    
    /**
     * @brief 阴极门控取消按钮点击槽函数
     */
    void onCathodeGateCancelClicked();

    /**
     * @brief MCP门控设置按钮点击槽函数
     */
    void onMCPGateSetClicked();

    /**
     * @brief MCP门控取消按钮点击槽函数
     */
    void onMCPGateCancelClicked();
     
    /**
     * @brief 启动监控槽函数
     * @param enabled 开关状态，true为开启，false为关闭
     */
    void onMonitorEnabledChanged(bool enabled);
    
    /**
     * @brief 更新监控信息
     */
    void onUpdateMonitorInfo();

public:
signals:
    /**
     * @brief syncParameters 同步配置参数
     */
    void syncParameters();

public  slots:
    /**
     * @brief onSyncParameters 同步配置参数
     */
    void onSyncParameters();

private:

    /**
     * @brief 鼠标按下事件处理函数
     * @param event 鼠标事件对象
     */
    void mousePressEvent(QMouseEvent *event) override;
    
    /**
     * @brief 鼠标移动事件处理函数
     * @param event 鼠标事件对象
     */
    void mouseMoveEvent(QMouseEvent *event) override;
    
    /**
     * @brief 鼠标释放事件处理函数
     * @param event 鼠标事件对象
     */
    void mouseReleaseEvent(QMouseEvent *event) override;

    /**
     * @brief 初始化按钮组
     * @details 创建并配置工作模式、扫描速度模式和触发源的按钮组
     */
    void initializeButtonGroups();

    /**
     * @brief 重置UI状态
     * @details 将所有UI控件恢复到默认状态，在设备断开连接时调用
     */
    void resetUI();

    /**
     * @brief 连接到设备
     */
    void connectToDevice();

    /**
     * @brief 断开与设备的连接
     */
    void disconnectFromDevice();
signals:

    /**
     * @brief 日志写入信号
     * @param logInfo 日志信息
     * @param logLevel 日志级别（默认0）
     * @param isSave 是否保存到文件（默认false）
     */
    void writeLog(const QString& logInfo,int logLevel=0,bool isSave=false);

private:
    Ui::SKFunctionSet *ui;           // UI界面指针
    ScanCameraDevice* m_device;      // 设备指针

    bool m_IsMonitor;               // 是否更新监控数据
    QTimer m_MonitorTimer;          //监控数据定时器
    
    // 拖动相关变量
    bool m_dragging;                 // 是否正在拖动
    bool m_mousePressed;             // 鼠标是否按下
    QPoint m_lastMousePosition;      // 上一次鼠标位置
    
    // 按钮组
    QButtonGroup* m_workModeButtonGroup;         // 工作模式按钮组
    QButtonGroup* m_scanSpeedModeButtonGroup;    // 扫描速度模式按钮组
    QButtonGroup* m_triggerSourceButtonGroup;    // 触发源按钮组

};

#endif // SKFUNCTIONSET_H
